package com.wl.servlets;

import com.wl.fruit.dao.FruitDAO;
import com.wl.fruit.dao.impl.FruitDAOImpl;
import com.wl.fruit.pojo.Fruit;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/*
1) 继承关系 HttpServlet -> GenericServlet -> Servlet
2) Servlet的核心方法 init() service() destroy()
3) 服务中心: 当有请求 service()会自动响应 (其实是tomcat调用的)
    在HttpServlet中会分析请求方式 然后决定调用那个do开头的方法
    若子类不存在调用的方式 则会405错误

Servlet生命周期
    1) 生命周期 init() -> service() -> destroy()
    2) 默认情况下 第一次接受请求时 这个Servlet会进行实例化(调用构造方法) 初始化（init)
        然后服务 (service)从第二次请求开始, 每一次都是服务
        当容器关闭时 其中的servlet实例都会被销毁（destroy)
    3) servlet实例tomcat只会创建一个 所有请求都是这个实例去响应
        默认情况下 第一次请求 tomcat才会去实例化 初始化 然后服务
            好处: 提高系统启动速度
            缺点: 第一次请求时 耗时较长
        若要提高系统的响应速度 设置Servlet初始化时机
    4) servlet启动先后顺序，数字越小越靠前，最小值0 <load-on-startup>1</load-on-startup>
    5) Servlet在容器中: 单例、线程不安全
        单例: 所有请求都是同一实例去响应
        线程不安全: 一个线程需要根据这个实例中的某个成员变量值去做逻辑判断。
        但是中间某个时机, 另一个线程改变了这个成员变量的值, 从而导致第一个线程执行路径发生变化

        避免线程不安全:
            1.尽量不在servlet中定义成员变量
            2.如果定义, 尽量不使用做判断 以及 修改这个值
 */

public class AddServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 若是get请求的中文 tomcat8之前 转码麻烦
        //String fname = req.getParameter("fname");
        // 1.将字符串打散成字节数组
        //byte[] bytes = fname.getBytes(StandardCharsets.ISO_8859_1);
        // 2.将字节数组按照设定的编码重新组装成字符串
        //fname = new String(bytes, StandardCharsets.UTF_8);

        /*
        post方式下 设置编码 防止中文乱码
        get方式目前不需要设置编码(基于tomcat8)
         */
        // 防止中文乱码
        req.setCharacterEncoding(StandardCharsets.UTF_8.toString());
        String fname = req.getParameter("fname");
        Integer price = Integer.parseInt(req.getParameter("price"));
        Integer fcount = Integer.parseInt(req.getParameter("fcount"));
        String remark = req.getParameter("remark");

//        System.out.println("fname = " + fname);
//        System.out.println("price = " + price);
//        System.out.println("fcount = " + fcount);
//        System.out.println("remark = " + remark);
        FruitDAO fruitDAO = new FruitDAOImpl();
        boolean flag = fruitDAO.addFruit(new Fruit(0, fname, price, fcount, remark));
//        System.out.println(flag ? "添加成功" : "添加失败");
        resp.sendRedirect("index");
    }
}
